[IA64] Sort out the XEN_IA64_OPTF_IDENT_MAP_REG[457] constants confusion
authorAlex Williamson <alex.williamson@hp.com>
Sun, 30 Dec 2007 20:02:16 +0000 (13:02 -0700)
committerAlex Williamson <alex.williamson@hp.com>
Sun, 30 Dec 2007 20:02:16 +0000 (13:02 -0700)
Currently the constants are used for two different purpose.
one is for the OPTF hypercall sub command.
another is bit flag for struct opt_feature::mask.
They are different spaces, split them out.

Signed-off-by: Isaku Yamahata <yamahata@valinux.co.jp>
xen/arch/ia64/vmx/mmio.c
xen/arch/ia64/vmx/vmx_fault.c
xen/arch/ia64/xen/domain.c
xen/arch/ia64/xen/vcpu.c
xen/include/asm-ia64/domain.h
xen/include/public/arch-ia64.h

index c496d3fe64624449e4ce9385ff6410844a982579..287e7a19f748a929e34f766f0285834879f11199 100644 (file)
@@ -253,11 +253,11 @@ static int vmx_identity_mappings_save(struct domain *d,
     const struct opt_feature *optf = &d->arch.opt_feature;
     struct hvm_hw_ia64_identity_mappings im_save;
 
-    __vmx_identity_mapping_save(optf->mask & XEN_IA64_OPTF_IDENT_MAP_REG4,
+    __vmx_identity_mapping_save(optf->mask & XEN_IA64_OPTF_IDENT_MAP_REG4_FLG,
                                 &optf->im_reg4, &im_save.im_reg4);
-    __vmx_identity_mapping_save(optf->mask & XEN_IA64_OPTF_IDENT_MAP_REG5,
+    __vmx_identity_mapping_save(optf->mask & XEN_IA64_OPTF_IDENT_MAP_REG5_FLG,
                                 &optf->im_reg5, &im_save.im_reg5);
-    __vmx_identity_mapping_save(optf->mask & XEN_IA64_OPTF_IDENT_MAP_REG7,
+    __vmx_identity_mapping_save(optf->mask & XEN_IA64_OPTF_IDENT_MAP_REG7_FLG,
                                 &optf->im_reg7, &im_save.im_reg7);
 
     return hvm_save_entry(OPT_FEATURE_IDENTITY_MAPPINGS, 0, h, &im_save);
index a06cae80b3fb0e6adb66953691f209ed0303b358..dbb4a077120fb39efd3aa3076427fec8afaabbe5 100644 (file)
@@ -392,7 +392,7 @@ try_again:
 
         if (!vhpt_enabled(v, vadr, misr.rs ? RSE_REF : DATA_REF)) {
             /* windows use region 4 and 5 for identity mapping */
-            if ((optf->mask & XEN_IA64_OPTF_IDENT_MAP_REG4) &&
+            if ((optf->mask & XEN_IA64_OPTF_IDENT_MAP_REG4_FLG) &&
                 REGION_NUMBER(vadr) == 4 && !(regs->cr_ipsr & IA64_PSR_CPL) &&
                 REGION_OFFSET(vadr) <= _PAGE_PPN_MASK) {
 
@@ -402,7 +402,7 @@ try_again:
                     goto try_again;
                 return IA64_NO_FAULT;
             }
-            if ((optf->mask & XEN_IA64_OPTF_IDENT_MAP_REG5) &&
+            if ((optf->mask & XEN_IA64_OPTF_IDENT_MAP_REG5_FLG) &&
                 REGION_NUMBER(vadr) == 5 && !(regs->cr_ipsr & IA64_PSR_CPL) &&
                 REGION_OFFSET(vadr) <= _PAGE_PPN_MASK) {
 
@@ -428,8 +428,8 @@ try_again:
         }
 
         /* avoid recursively walking (short format) VHPT */
-        if (!(optf->mask & XEN_IA64_OPTF_IDENT_MAP_REG4) &&
-            !(optf->mask & XEN_IA64_OPTF_IDENT_MAP_REG5) &&
+        if (!(optf->mask & XEN_IA64_OPTF_IDENT_MAP_REG4_FLG) &&
+            !(optf->mask & XEN_IA64_OPTF_IDENT_MAP_REG5_FLG) &&
             (((vadr ^ vpta.val) << 3) >> (vpta.size + 3)) == 0) {
             goto inject_dtlb_fault;
         }
index 2ed034079cf3acdea7c5c8344544c8be5f905c87..c0a94e5df8990fcb386f0a90d2e2dac4dc471f3b 100644 (file)
@@ -2277,16 +2277,36 @@ custom_param("dom0_mem", parse_dom0_mem);
  * Helper function for the optimization stuff handling the identity mapping
  * feature.
  */
+static inline unsigned long
+optf_identity_mapping_cmd_to_flg(unsigned long cmd)
+{
+       switch(cmd) {
+       case XEN_IA64_OPTF_IDENT_MAP_REG7:
+               return XEN_IA64_OPTF_IDENT_MAP_REG7_FLG;
+       case XEN_IA64_OPTF_IDENT_MAP_REG4:
+               return XEN_IA64_OPTF_IDENT_MAP_REG4_FLG;
+       case XEN_IA64_OPTF_IDENT_MAP_REG5:
+               return XEN_IA64_OPTF_IDENT_MAP_REG5_FLG;
+       default:
+               BUG();
+               return 0;
+       }
+
+       /* NOTREACHED */
+}
+
 static inline void
 optf_set_identity_mapping(unsigned long* mask, struct identity_mapping* im,
                          struct xen_ia64_opt_feature* f)
 {
+       unsigned long flag = optf_identity_mapping_cmd_to_flg(f->cmd);
+
        if (f->on) {
-               *mask |= f->cmd;
+               *mask |= flag;
                im->pgprot = f->pgprot;
                im->key = f->key;
        } else {
-               *mask &= ~(f->cmd);
+               *mask &= ~flag;
                im->pgprot = 0;
                im->key = 0;
        }
index 9e0569aab3e30fef3c1621758444322170bef749..36c9bb2d81ff251c92b7da576eeeebeda0027221 100644 (file)
@@ -1779,7 +1779,7 @@ IA64FAULT vcpu_translate(VCPU * vcpu, u64 address, BOOLEAN is_data,
                struct opt_feature* optf = &(vcpu->domain->arch.opt_feature);
 
                /* Optimization for identity mapped region 7 OS (linux) */
-               if (optf->mask & XEN_IA64_OPTF_IDENT_MAP_REG7 &&
+               if (optf->mask & XEN_IA64_OPTF_IDENT_MAP_REG7_FLG &&
                    region == 7 && ia64_psr(regs)->cpl == CONFIG_CPL0_EMUL) {
                        pte.val = address & _PAGE_PPN_MASK;
                        pte.val = pte.val | optf->im_reg7.pgprot;
index 97f6c8f8212cd44ef6b404d055b61c8b2ad027b7..ec0616b0a6daad53daeaf28ff8710790c13db37d 100644 (file)
@@ -93,6 +93,29 @@ struct identity_mapping {
         unsigned long key;     /* A protection key. */
 };
 
+/* opt_feature mask */
+/*
+ * If this feature is switched on, the hypervisor inserts the
+ * tlb entries without calling the guests traphandler.
+ * This is useful in guests using region 7 for identity mapping
+ * like the linux kernel does.
+ */
+#define XEN_IA64_OPTF_IDENT_MAP_REG7_FLG_BIT    0
+#define XEN_IA64_OPTF_IDENT_MAP_REG7_FLG        \
+       (1UL << XEN_IA64_OPTF_IDENT_MAP_REG7_FLG_BIT)
+
+/* Identity mapping of region 4 addresses in HVM. */
+#define XEN_IA64_OPTF_IDENT_MAP_REG4_FLG_BIT    \
+        (XEN_IA64_OPTF_IDENT_MAP_REG7_FLG_BIT + 1)
+#define XEN_IA64_OPTF_IDENT_MAP_REG4_FLG        \
+        (1UL << XEN_IA64_OPTF_IDENT_MAP_REG4_FLG_BIT)
+
+/* Identity mapping of region 5 addresses in HVM. */
+#define XEN_IA64_OPTF_IDENT_MAP_REG5_FLG_BIT    \
+        (XEN_IA64_OPTF_IDENT_MAP_REG7_FLG_BIT + 2)
+#define XEN_IA64_OPTF_IDENT_MAP_REG5_FLG        \
+        (1UL << XEN_IA64_OPTF_IDENT_MAP_REG5_FLG_BIT)
+
 /* Central structure for optimzation features used by the hypervisor.  */
 struct opt_feature {
     unsigned long mask;                        /* For every feature one bit. */
index dda3de6a677dfec3cae6806e5c6ede65ff3b9509..9940d93ebae1ecf01357fa805430ecd55c920857 100644 (file)
@@ -604,21 +604,13 @@ struct xen_ia64_boot_param {
  * This is useful in guests using region 7 for identity mapping
  * like the linux kernel does.
  */
-#define XEN_IA64_OPTF_IDENT_MAP_REG7_BIT       0
-#define XEN_IA64_OPTF_IDENT_MAP_REG7           \
-       (1UL << XEN_IA64_OPTF_IDENT_MAP_REG7_BIT)
+#define XEN_IA64_OPTF_IDENT_MAP_REG7    1
 
 /* Identity mapping of region 4 addresses in HVM. */
-#define XEN_IA64_OPTF_IDENT_MAP_REG4_BIT        \
-        (XEN_IA64_OPTF_IDENT_MAP_REG7_BIT + 1)
-#define XEN_IA64_OPTF_IDENT_MAP_REG4            \
-        (1UL << XEN_IA64_OPTF_IDENT_MAP_REG4_BIT)
+#define XEN_IA64_OPTF_IDENT_MAP_REG4    2
 
 /* Identity mapping of region 5 addresses in HVM. */
-#define XEN_IA64_OPTF_IDENT_MAP_REG5_BIT        \
-        (XEN_IA64_OPTF_IDENT_MAP_REG7_BIT + 2)
-#define XEN_IA64_OPTF_IDENT_MAP_REG5            \
-        (1UL << XEN_IA64_OPTF_IDENT_MAP_REG5_BIT)
+#define XEN_IA64_OPTF_IDENT_MAP_REG5    3
 
 #define XEN_IA64_OPTF_IDENT_MAP_NOT_SET  (0)